import { defineStore } from 'pinia'
import { ref } from 'vue'

// ----------------------------------------------------
// Pinia Store: 负责管理全局的“当前播放”状态
// ----------------------------------------------------

export const useAudioCoordinatorStore = defineStore('audioCoordinator', () => {
    // 状态：记录当前正在播放的音频实例的唯一ID
    const activeAudioId = ref(null)

    // 注册表：存储所有 useAudio 实例的引用和它们暂停的方法
    // 结构: Map<Symbol, { pause: Function, isPlayingRef: Ref<Boolean> }>
    const audioRegistry = new Map()

    /**
     * Action: 实例在挂载时调用，将自己注册到协调器中
     * @param {Symbol} id - 实例唯一ID
     * @param {Function} pauseMethod - 实例自身的暂停方法
     * @param {Ref<Boolean>} isPlayingRef - 实例自身的 isPlaying 响应式引用
     */
    function registerInstance(id, pauseMethod, isPlayingRef) {
        audioRegistry.set(id, { pause: pauseMethod, isPlayingRef })
    }

    /**
     * Action: 实例在卸载时调用
     * @param {Symbol} id - 实例唯一ID
     */
    function unregisterInstance(id) {
        audioRegistry.delete(id);
        if (activeAudioId.value === id) {
            activeAudioId.value = null
        }
    }

    /**
     * Action: 当一个实例开始播放时调用，负责暂停其他所有实例
     * @param {Symbol} newId - 准备播放的实例ID
     */
    function startPlayback(newId) {
        if (activeAudioId.value === newId) {
            // 已经在播放
            return;
        }

        // 遍历注册表，暂停非当前ID的所有实例
        audioRegistry.forEach((instance, id) => {
            if (id !== newId && instance.isPlayingRef.value) {
                // 调用实例自身的暂停方法
                instance.pause()
            }
        })

        // 更新全局状态
        activeAudioId.value = newId
    }

    /**
     * Action: 当一个实例暂停或结束时调用，负责清理全局状态
     * @param {Symbol} id - 暂停的实例ID
     */
    function stopPlayback(id) {
        if (activeAudioId.value === id) {
            activeAudioId.value = null;
        }
    }

    return {
        activeAudioId,
        registerInstance,
        unregisterInstance,
        startPlayback,
        stopPlayback,
    };
})